package com.yusys.ba04;

import com.yusys.ba02.Student;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.util.ObjectUtils;

import java.util.Date;

/**
 * 后置通知定义方法，方法是实现切面功能的
 * 方法的定义要求：
 * 1.公共方法public
 * 2.方法没有返回值
 * 3.方法名称自定义
 * 4.方法有参数
 */
@Aspect
public class MyAspect {

    /**
     * @Around：环绕通知 属性：value 切入点表达式
     * 位置：在方法的定义上面
     * 特点：
     * 1.它的功能是最强的通知
     * 2.在目标方法的前和后都能增强功能
     * 3.控制目标方法是否被调用执行
     * 4.修改原来的目标方法的执行结果，影响最后的调用结果
     * 环绕通知，等同于jdk动态代理的InvocationHandler接口
     */
    @Around(value = "execution(* *..SomeServiceImpl.doFirst(..))")
    public Object myAround(ProceedingJoinPoint pjp) throws Throwable {
        Object res = null;
        System.out.println("环绕通知，在目标方法之前：" + new Date());
        // 控制方法执行
        Object[] args = pjp.getArgs();
        if (!ObjectUtils.isEmpty(args)) {
            Object arg = args[0];
            if (arg.toString().equals("张三")) {
                res = pjp.proceed();
            }
        }

        if (!ObjectUtils.isEmpty(res)) {
            res = "hello AspectJ AOP";
        }
        System.out.println("环绕通知，在目标方法之后：提交事务");
        return res;
    }
}
